home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 July & August / PCWorld_2007-07-08_cd.bin / komunikace / maxthon / mcombo.exe / Plugin / Del.icio.us Sidebar / scripts / Delicious.js next >
Text File  |  2006-09-02  |  11KB  |  441 lines

  1. /**************************
  2.     Del.icio.us Sidebar
  3.     By Neo101
  4.     Version 1.1.0
  5. **************************/
  6.  
  7. checkSettingsFile()
  8.  
  9. var userName = decodeURIComponent( decodeTxt( readSetting('userName') ) )
  10. var password = decodeURIComponent( decodeTxt( readSetting('password') ) )
  11.  
  12.     
  13. var showTooltip = readSetting('showTooltip', '1')
  14. var autoUpdateTime = parseInt( readSetting('autoUpdateTime', '0') )
  15. var sortTags = readSetting('sortTags', '1')
  16.     
  17. var baseURL = 'https://api.del.icio.us/v1/'
  18. var favoritesCache = 'cache/favorites.html'
  19.  
  20. var favoritesHTML = ''
  21. var posts = new Array()
  22.  
  23. var xmlhttp
  24.  
  25. var editElement
  26. var isAddFavorite = true
  27.  
  28. window.onload = function(){
  29.     if(userName == '' || password == ''){
  30.         displaySettings()
  31.         document.getElementById('menu').innerHTML = 'Del.icio.us Sidebar'
  32.         document.getElementById('settingsLinks').style.display = 'none'
  33.         document.getElementById('links').style.display = 'none'
  34.     } else {
  35.         viewFavorites()
  36.         getLastUpdateTime()
  37.         setLinks()
  38.     }
  39.     
  40.     setSettingsForm()
  41.     
  42.     setAutoUpdate()
  43. }
  44.  
  45.  
  46. function setLinks(){
  47.     document.getElementById('yourFavoritesLink').href = 'http://del.icio.us/' + userName
  48.     document.getElementById('yourNetworkLink').href = 'http://del.icio.us/network/' + userName
  49.     document.getElementById('importBookmarksLink').href = 'https://secure.del.icio.us/settings/' + userName + '/bookmarks/import'
  50.     document.getElementById('exportBookmarksLink').href = 'https://secure.del.icio.us/settings/' + userName + '/bookmarks/export'
  51. }
  52.  
  53.  
  54. function setAutoUpdate(){
  55.     if(isNaN(autoUpdateTime) || autoUpdateTime < 5){
  56.         return
  57.     }
  58.     var time = autoUpdateTime * 1000 * 60
  59.     window.setInterval('getLastUpdateTime()', time)
  60. }
  61.  
  62.  
  63. function loadXMLDoc(url, type, stateChange, data){
  64.     if(userName == '' || password == ''){
  65.         showError('User information not defined!')
  66.         return
  67.     }
  68.     try{
  69.         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
  70.     }
  71.     catch(err){
  72.         showError('Could not load ActiveX object')
  73.     }
  74.     xmlhttp.onreadystatechange = stateChange
  75.     xmlhttp.open("GET", url, true, userName, password)
  76.     xmlhttp.setRequestHeader('User-Agent', 'Maxthon del.icio.us sidebar plugin 1.0')
  77.     xmlhttp.send(null)
  78.     
  79. }
  80.  
  81.  
  82. function checkReadyState(obj){
  83.     if(obj.readyState == 4){
  84.         if(obj.status == 200 || obj.status == 201){
  85.             return true;
  86.         }
  87.         else if(obj.status == 401 || obj.status == 403){
  88.             var message = 'Could not login. Please check your '+
  89.                 '<a href="#" onclick="displaySettings()" style="color:red;text-decoration:underline">login information!</a>'
  90.             showError(message)
  91.             document.getElementById('favorites').innerHTML = message
  92.         }
  93.         else if(obj.status == 503){
  94.             showError('Error 503: Please try again..')
  95.         }
  96.         else{
  97.             showError(obj.status + ' ' + obj.responseText);
  98.         }
  99.     }
  100. }
  101.  
  102.  
  103. function getLastUpdateTime(){
  104.     var url = baseURL + 'posts/update?' + Math.round(Math.random() * 1000)
  105.     
  106.     showError('Checking for updates...')
  107.     loadXMLDoc(url, 'getLastUpdateTime', onResponseGetLastUpdateTime)
  108. }
  109.  
  110.  
  111. function onResponseGetLastUpdateTime(){
  112.     if( ! checkReadyState(xmlhttp) ){
  113.         return
  114.     }
  115.     
  116.     var responseXML = xmlhttp.responseXML
  117.     if( responseXML == null ){
  118.         showError('Error loading XML')
  119.         return
  120.     }
  121.     
  122.     try{
  123.         var lastUpdateTime = responseXML.getElementsByTagName("update")[0].getAttribute('time') 
  124.     } catch(err){
  125.         showError('bad response getting time...')
  126.         alert(xmlhttp.responseText)
  127.         return
  128.     }
  129.     
  130.     var previousUpdateTime = readSetting('UpdateTime')
  131.     if( previousUpdateTime != lastUpdateTime){
  132.         showError('Update available')
  133.         writeSetting('UpdateTime', lastUpdateTime)
  134.         window.setTimeout('downloadFavorites()', 1000)
  135.     }else {
  136.         showError('No favorite updates')
  137.     }
  138. }
  139.  
  140.  
  141. function viewFavorites(){
  142.     var html = unescape( readFile(favoritesCache) )
  143.     if(html == null || html == ''){
  144.         writeSetting('UpdateTime', '')
  145.         return
  146.     }
  147.     favoritesHTML = html
  148.     currentlyOpenFolder = null
  149.     document.getElementById('favorites').innerHTML = html
  150. }
  151.  
  152.  
  153. function downloadFavorites(){
  154.     var url = baseURL + 'posts/all?' + + Math.round(Math.random() * 1000)
  155.     
  156.     showError('Updating...')
  157.     loadXMLDoc(url, 'viewFavorites', onResponseViewFavorites)
  158. }
  159.  
  160.  
  161. function onResponseViewFavorites(){
  162.     if( ! checkReadyState(xmlhttp) ){
  163.         return
  164.     }
  165.     var responseXML = xmlhttp.responseXML
  166.     if( responseXML == null ){
  167.         showError('Error loading XML')
  168.         return
  169.     }
  170.  
  171.     var response = ''
  172.     
  173.     posts = new Array()
  174.     
  175.     items = responseXML.getElementsByTagName("post"); 
  176.  
  177.     if(items && items.length != 0 ){
  178.         for(var j=0; j < items.length; j++) {
  179.             addPost(items[j], posts)
  180.         }
  181.     }
  182.     else{
  183.         response += '<b>No favorites found</b>'
  184.     }
  185.     
  186.     var tags = new Array()
  187.     
  188.     addPostsToTags( posts, tags )
  189.     
  190.     if(sortTags == '1'){
  191.         tags.sort()
  192.     }
  193.     
  194.     response += writeTree( tags )
  195.     
  196.     writeFile(favoritesCache, escape( response ))
  197.     
  198.     favoritesHTML = response
  199.     
  200.     showError('Favorites Downloaded')
  201.     
  202.     document.getElementById('favorites').innerHTML = response
  203.     currentlyOpenFolder = null
  204.     
  205.     document.getElementById('searchbox').value = ''
  206. }
  207.  
  208.  
  209.  
  210. function addPostsToTags( postsArray, tagsArray ){
  211.     for(var i=0; i<postsArray.length; i++){
  212.         var tags = postsArray[i].tag.toLowerCase()
  213.         var tagArray = tags.split(' ')
  214.         for(var j=0; j<tagArray.length; j++){
  215.             var position = inArray(tagArray[j], tagsArray)
  216.             if( position >= 0 ){
  217.                 tagsArray[position][1].push( postsArray[i] )
  218.             } else {
  219.                 tagsArray.push(new Array( tagArray[j], new Array( postsArray[i] ) ) )
  220.             }
  221.         }
  222.     }
  223. }
  224.     
  225.     
  226. function writeTree( tagsArray ){
  227.     var html = ''
  228.     var unfiledHtml = ''
  229.     
  230.     for( var i=0; i<tagsArray.length; i++ ){
  231.         var tag = tagsArray[i][0]
  232.         if(tag == 'system:unfiled'){
  233.             unfiledHtml = addLinks( tagsArray[i][1] )
  234.             continue
  235.         }
  236.         html += '<div class="trigger" onclick="expandCollapse(' + i + ')" oncontextmenu="showContextMenu(this);return false" '+
  237.                         'onmouseover="this.style.textDecoration=\'underline\'" onmouseout="this.style.textDecoration=\'none\'">'+
  238.                     '<img src="images/folderClosed.gif" border="0" id="folder' + i + '">'+
  239.                     tag + 
  240.                 '</div>\n<div class="branch" id="branch' + i + '">'
  241.         html += addLinks( tagsArray[i][1] )
  242.         html += '</div>\n'
  243.     }
  244.     html += unfiledHtml
  245.     
  246.     return html
  247. }
  248.  
  249.  
  250. function addLinks(items){
  251.     var html = ''
  252.     for(var i=0; i<items.length; i++){
  253.         var item = items[i]
  254.         html += '<div class=linkDiv oncontextmenu="showContextMenu(this);return false">'+
  255.                     '<a class=link href="' + item.href + '" target=_blank title="' + item.tooltip + '" '+
  256.                             'onmouseover="showLink(this.href)" onmouseout="hideLink()" '+
  257.                             'extended="' + item.extended + '" tag="' + item.tag + '" hashCode="' + item.hash + '">'+
  258.                         '<img src="images/page.gif">' +
  259.                         item.description +
  260.                     '</a>'+
  261.                 '</div>\n'
  262.     }
  263.     return html
  264. }
  265.  
  266.  
  267. function addPost( item , array){
  268.     var href = item.getAttribute('href')
  269.     var description = item.getAttribute('description')
  270.     var tag = item.getAttribute('tag')
  271.     var time = item.getAttribute('time').substring(0,10)
  272.     var hash = item.getAttribute('hash')
  273.     var extended = item.getAttribute('extended')
  274.     if(extended == null){
  275.         extended = ''
  276.     }
  277.     
  278.     if(showTooltip == '1'){
  279.         var tooltip = 'Added: ' + time
  280.         
  281.         var MAX_DESCRIPTION_LENGTH = 30
  282.         
  283.         if(description.length > MAX_DESCRIPTION_LENGTH){
  284.             tooltip = description + '\n' + tooltip
  285.         }
  286.         
  287.         if(extended){
  288.             tooltip += '\nNote: ' + extended
  289.         }
  290.     } else {
  291.         var tooltip = ''
  292.     }
  293.     
  294.     array.push( {'href':href,
  295.                 'description':description,
  296.                 'tag':tag,
  297.                 'time':time,
  298.                 'hash':hash,
  299.                 'extended':extended,
  300.                 'tooltip':tooltip
  301.                 } )
  302. }
  303.     
  304.  
  305. function onResponsePostFavorite(){
  306.     if( ! checkReadyState(xmlhttp) ){
  307.         return
  308.     }
  309.     var responseXML = xmlhttp.responseXML
  310.     if( responseXML == null ){
  311.         showError('Error loading XML')
  312.         return
  313.     }
  314.     
  315.     try{
  316.         var response = responseXML.getElementsByTagName("result")[0].getAttribute('code') 
  317.     } catch(err){
  318.         showError('bad response Posting...')
  319.         alert(xmlhttp.responseText)
  320.         return
  321.     }
  322.     
  323.     
  324.     if(response == 'done'){
  325.         showError('Favorite added!')
  326.         window.setTimeout('getLastUpdateTime()', 1000)
  327.     }
  328.     
  329. }
  330.  
  331.  
  332. function deleteFavorite(url){
  333.     var url = baseURL + 'posts/delete?url=' + encodeURIComponent( url )
  334.     
  335.     showError('deleting...')
  336.     loadXMLDoc(url, 'deleteFavorite', onResponseDeleteFavorite)
  337. }
  338.  
  339.  
  340. function onResponseDeleteFavorite(){
  341.     if( ! checkReadyState(xmlhttp) ){
  342.         return
  343.     }
  344.     var responseXML = xmlhttp.responseXML
  345.     if( responseXML == null ){
  346.         showError('Error loading XML')
  347.         return
  348.     }
  349.     
  350.     try{
  351.         var response = responseXML.getElementsByTagName("result")[0].getAttribute('code') 
  352.     } catch(err){
  353.         showError('bad response Deleting...')
  354.         alert(xmlhttp.responseText)
  355.         return
  356.     }
  357.     
  358.     
  359.     if(response == 'done'){
  360.         showError('Favorite deleted!')
  361.         window.setTimeout('getLastUpdateTime()', 1000)
  362.     } else {
  363.         showError('Error: ' + response)
  364.     }
  365. }
  366.  
  367.  
  368. function getCurrentWebsiteURL(){
  369.     return external.get_tab(SECURITY_ID, external.cur_sel).document.URL
  370. }
  371.  
  372. function getCurrentWebsiteTitle(){
  373.     return external.get_tab(SECURITY_ID, external.cur_sel).document.title
  374. }
  375.  
  376. function getEditWebsiteURL(){
  377.     return editElement.href
  378. }
  379.  
  380. function getEditWebsiteTitle(){
  381.     return editElement.innerText
  382. }
  383.  
  384. function getEditWebsiteNotes(){
  385.     return editElement.extended
  386. }
  387.  
  388. function getEditWebsiteTags(){
  389.     return editElement.tag
  390. }
  391.  
  392. function displaySettings(){
  393.     document.getElementById('favorites').style.display = 'none'
  394.     document.getElementById('settings').style.display = ''
  395.     document.getElementById('message').style.display = 'none'
  396. }
  397.  
  398. function hideSettings(){
  399.     document.getElementById('favorites').style.display = ''
  400.     document.getElementById('settings').style.display = 'none'
  401.     document.getElementById('message').style.display = 'none'
  402. }
  403.  
  404. function cancel(){
  405.     hideSettings()
  406.     
  407.     if(userName == '' || password == ''){
  408.         var message = '<a href="javascript:displaySettings()">Login first!</a>'
  409.         document.getElementById('favorites').innerHTML = message
  410.     }
  411. }
  412.  
  413. function save(){
  414.     userNameNew = encodeURIComponent( document.getElementById('userName').value )
  415.     passwordNew = encodeURIComponent( document.getElementById('password').value )
  416.  
  417.     writeSetting('userName', encodeTxt( userNameNew ))
  418.     writeSetting('password', encodeTxt( passwordNew ))
  419.     
  420.     if(userName != userNameNew){
  421.         writeFile(favoritesCache, '')
  422.         writeSetting('UpdateTime', '')
  423.     }
  424.  
  425.     location.reload()
  426. }
  427.  
  428. function setSettingsForm(){
  429.     document.getElementById('userName').value = userName
  430.     document.getElementById('password').value = password
  431. }
  432.  
  433.  
  434. function inArray( text, array ){
  435.     for(var i=0; i<array.length; i++){
  436.         if(text == array[i][0]){
  437.             return i
  438.         }
  439.     }
  440.     return -1
  441. }